package br.unisal.domain;

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import br.unisal.factory.ClienteFactory;

public class PedidoTeste {

	private Pedido pedido, pedido1, pedido2, pedido3, pedido4;
	private ClienteFactory fabricaCliente = new ClienteFactory();
	private Cliente cliente;
	private Produto produto;
	private List<ItemSolicitado> itens = new ArrayList<>();
	private ItemSolicitado itemSolicitado;
	private Entregador entregador;
	
	@Before
	public void inicializa(){
		cliente = fabricaCliente.criaCliente("3131", "Antonio", "Silva", "", 0, "", "", "");
		pedido = new Pedido(cliente, null, FormaDePagamento.DINHEIRO);
		
		produto = new Produto(1, "frango", 1, "borda recheada", 30.00, true);
		cliente = fabricaCliente.criaCliente("1112", "Red", "Silva", "aaa", 11, "aa", "aa", "aa");
		itemSolicitado = new ItemSolicitado(produto, 1);
		itens.add(itemSolicitado);
		
		pedido1 = new Pedido(cliente, itens, FormaDePagamento.DINHEIRO);
		pedido2 = new Pedido(cliente, itens, FormaDePagamento.CARTAOCREDITO);
		pedido3 = new Pedido(cliente, itens, FormaDePagamento.CARTAODEBITO);
		pedido4 = new Pedido(cliente, itens, FormaDePagamento.OUTROS);
		
		entregador = new Entregador("Cidao", "Silva", new CPF("22222222234"));
	}
	
	@Test
	public void valorBrutoDoPedidoSemItensNaoPodeSerNulo() {
		Double resultado = pedido.getValorBrutoPedido();
		assertEquals(0, resultado, 0.00001);
	}
	
	@Test
	public void valorFinalDoPedidoSemItensNaoPodeSerNulo() {
		Double resultado = pedido.getValorFinalPedido();
		assertEquals(0, resultado, 0.00001);
	}
	
	@Test
	public void verificaValorBrutoParaPagamentoEmDINHEIRO(){
		assertEquals(pedido1.getValorBrutoPedido(), 30.0 ,0.00001);
	}
	
	@Test
	public void verificaValorBrutoParaPagamentoEmCARTAOCREDITO(){
		assertEquals(pedido2.getValorBrutoPedido(), 30.0 ,0.00001);
	}
	
	@Test
	public void verificaValorBrutoParaPagamentoEmCARTAODEBITO(){
		assertEquals(pedido3.getValorBrutoPedido(), 30.0 ,0.00001);
	}
	
	@Test
	public void verificaValorBrutoParaPagamentoEmOUTROS(){
		assertEquals(pedido4.getValorBrutoPedido(), 30.0 ,0.00001);
	}

	@Test
	public void verificaValorFinalParaPagamentoEmDINHEIRO(){
		assertEquals(pedido1.getValorFinalPedido(), 28.5 ,0.00001);
	}
	
	@Test
	public void verificaValorFinalParaPagamentoEmCARTAOCREDITO(){
		assertEquals(pedido2.getValorFinalPedido(), 31.5 ,0.00001);
	}
	
	@Test
	public void verificaValorFinalParaPagamentoEmCARTAODEBITO(){
		assertEquals(pedido3.getValorFinalPedido(), 30.0 ,0.00001);
	}
	
	@Test
	public void verificaValorFinalParaPagamentoEmOUTROS(){
		assertEquals(pedido4.getValorFinalPedido(), 33.0 ,0.00001);
	}
	
	@Test
	public void verificaSePedidoAbertoEstaTrue(){
		assertEquals(pedido1.isAtivo(), true);
	}
	
	@Test
	public void verificaEntregadorDoPedido(){
		pedido3.setEntregador(entregador);
		assertEquals(pedido3.getEntregador(), entregador);
	}
	
	@Test
	public void verificaTrocoDoPedido(){
		assertEquals(pedido3.calculaTroco(100.0), 70.0, 0.00001);
	}
	
	@Test
	public void verificaSePedidoFechadoEstaFalse(){
		pedido1.setAtivo(false);
		assertEquals(pedido1.isAtivo(), false);
	}
}
